package com.boot2.core.dao.datasource;


import java.util.EmptyStackException;
import java.util.Stack;

/**
 * @author zhangweilin
 * @date 2019/4/27 11:03
 * @description: 多数据源切换工具，注解@DataSource也是让自动调用此类
 */
public class DynamicDataSourceHolder {

    /**
     * @Fields CONTEXT_HOLDER : 使用ThreadLocal维护变量，ThreadLocal为每个使用该变量的线程提供独立的变量副本，
     * 所以每一个线程都可以独立地改变自己的副本，而不会影响其它线程所对应的副本。
     */
    private static final ThreadLocal<Stack<String>> CONTEXT_HOLDER = new ThreadLocal<>();

    /**
     * 只让同包下被调用，不允许 外部被调用
     *
     * @param dataSourceEnum
     */
    static void addContextHolder(String dataSourceEnum) {
//		CONTEXT_HOLDER.set(dataSourceEnum);

        Stack<String> stack = getStack();
        stack.push(dataSourceEnum);
    }

    static String getContextHolder() {
        Stack<String> stack = getStack();
//		return stack.pop();
        try {
            return stack.peek();
        } catch (EmptyStackException e) {
//			e.printStackTrace();
        }
        return null;
//		return CONTEXT_HOLDER.get();
    }

    /**
     * 用于业务中手工切换数据源
     *
     * @param dataSourceEnum
     */
    public static void setContextHolder(String dataSourceEnum) {
//		CONTEXT_HOLDER.set(dataSourceEnum);

        Stack<String> stack = getStack();
        if (stack.size() > 0) {
            stack.pop();
        }
        stack.push(dataSourceEnum);
    }

    /**
     * 释放当前堆栈值
     *
     * @return
     */
    static String releaseHolder() {
        Stack<String> stack = getStack();
        return stack.pop();
//		return stack.peek();
//		return CONTEXT_HOLDER.get();
    }

    static void clearContextHolder() {
        CONTEXT_HOLDER.remove();
    }

    /**
     * 获取堆栈
     *
     * @return
     */
    private static Stack<String> getStack() {
        Stack<String> stack = CONTEXT_HOLDER.get();
        if (null == stack) {
            stack = new Stack<>();
            CONTEXT_HOLDER.set(stack);
        }
        return stack;
    }



//	/**
//	 * 清空
//	 */
//	public static void clear() {
//		CONTEXT_HOLDER.remove();
//	}

}
